import { toNumber, toString } from "@lib/com.verify";

/** 二进制字符串 0000 和它的十进制数字 */
export type BitsData = {
  /** 十进制数字 */
  decimal: number;
  /** 二进制字符串：数字1 >>> 0001，如果 width 是4的情况 */
  bits: string;
  /** 二进制字符串的固定长度（不超过全部1的情况） */
  width: number;
};

/** 给定二进制字符返回对应数字，如 100,000,000 将会返回 256 */
export function doBitsToDecimal(bits: string): BitsData {
  bits = toString(bits);
  return {
    decimal: parseInt(bits, 2),
    bits,
    width: bits.length,
  };
}

/** 给定数字返回对应二进制字符，如 10 将会返回 1010
 * @maxBits 二进制的最大值，例如 4 代表 1111，所以 decimal 最多只能是 100
 */
export function doDecimalToBits(decimal: number, width: number): BitsData {
  width = toNumber(width);
  decimal = toNumber(decimal);

  const maxStr = "".padStart(width, "1");
  const maxNumber = parseInt(maxStr, 2);

  const decimalBits = decimal.toString(2).padStart(width, "0");
  const bits = decimal > maxNumber ? maxStr : decimalBits;
  return {
    decimal,
    bits,
    width,
  };
}

export function byteToKB(bytes: number, dots: number = 2) {
  const round = Math.pow(10, dots);
  return Math.ceil((round * bytes) / 1024) / round;
}

export function byteToMB(bytes: number, dots: number = 2) {
  const round = Math.pow(10, dots);
  return Math.ceil((round * bytes) / 1024 / 1024) / round;
}
